OPC Data Access specification is based on COM, and uses Windows VARIANT type (from COM Automation) for representing data values.
Note: Some OPC servers even use certain VARIANT types that are not officially supported by Microsoft.
Microsoft .NET has a different concept, and all data is represented using an Object type. Conversions between the two are available, but not always fully possible.
In addition, not everything that can be stored in an Object can later be processed by all .NET tools and languages. Microsoft has created so-called Common Language Specification (CLS), which has certain rules and restrictions that, if followed, guarantee cross-language compatibility. Public QuickOPC.NET components (assemblies) are fully CLS compliant, and that includes the way the data types are converted to and from OPC types.
QuickOPC.NET converts data from COM to .NET according to following table:
COM type (VARIANT) | .NET type (Object) |
VT_EMPTY | System.Object (null reference) |
VT_NULL | System.DBNull (singleton class) |
VT_I2 | System.Int16 |
VT_I4 | System.Int32 |
VT_R4 | System.Single |
VT_R8 | System.Double |
VT_CY | System.Decimal |
VT_DATE | System.DateTime |
VT_BSTR | System.String |
VT_DISPATCH | System.Object (not tested) |
VT_ERROR | System.Int32 |
VT_BOOL | System.Boolean |
VT_VARIANT | converted type of the target VARIANT |
VT_DECIMAL | System.Decimal |
VT_I1 | System.Int16 |
VT_UI1 | System.Byte |
VT_UI2 | System.Int32 |
VT_UI4 | System.Int64 |
VT_I8 | System.Int64 |
VT_UI8 | System.Decimal |
VT_INT | System.Int32 |
VT_UINT | System.Int64 |
VT_ARRAY | vtElement | System.Array of the converted vtElement type |
Types that are highlighted do not convert from COM to their “natural” .NET counterparts, because the corresponding .NET type is not CLS compliant. Instead, a “wider” type that is CLS compliant is chosen.
Types not listed in the above table at all are not supported.
Strings are internally represented in Unicode wherever possible.
QuickOPC-COM is meant to be used from applications based on COM Automation, and in general, any valid VARIANT can be processed by such application. Some automation tools and programming languages, however, have restrictions on types of data they can process. If your tool does not support the data type that the OPC server is using, without QuickOPC, you would be out of luck.
In order to provide the ability to work with widest range of OPC servers and the data types they use, QuickOPC-COM converts some data types available in OPC. We have made a research into the data types supported by various tools, and QuickOPC-COM uses a subset of VarType types that is guaranteed to work in most tools that are in use today (one of the most restrictive languages appears to be VBScript).
Note that the QuickOPC-COM only converts the data that it passes to your application – either in output arguments of property accessors or methods, or input arguments in event notifications. In the opposite direction, i.e. for data that your application passes to QuickOPC-COM, we use very “relaxed” approach, and accept the widest range of possible data types.
QuickOPC-COM converts data from OPC Data Access according to following table:
VARTYPE in OPC Data Access | VARTYPE In QuickOPC-COM |
VT_EMPTY | VT_EMPTY |
VT_NULL | VT_NULL |
VT_I2 | VT_I2 |
VT_I4 | VT_I4 |
VT_R4 | VT_R4 |
VT_R8 | VT_R8 |
VT_CY | VT_CY |
VT_DATE | VT_DATE |
VT_BSTR | VT_BSTR |
VT_DISPATCH | VT_DISPATCH |
VT_ERROR | VT_R8 |
VT_BOOL | VT_BOOL |
VT_VARIANT | VT_VARIANT |
VT_DECIMAL | VT_DECIMAL |
VT_I1 | VT_I2 |
VT_UI1 | VT_UI1 |
VT_UI2 | VT_I4 |
VT_UI4 | VT_R8 |
VT_I8 | VT_R8 (may lose precision) |
VT_UI8 | VT_R8 (may lose precision) |
VT_INT | VT_I4 |
VT_UINT | VT_R8 |
VT_ARRAY | vtElement | VT_ARRAY | VT_VARIANT(vtElement) *(see note below) |
Types that are highlighted are converted to a different data type. If a precise match does not exist, a “wider” type is chosen.
Types not listed in the above table at all are not supported.
Strings are internally represented in Unicode wherever possible.